
#ifndef SEMANTICS_SIMULATION_H

#define SEMANTICS_SIMULATION_H

#include "stdio.h"
#include "syntax_tree.h"
#include "generic_table.h"
#include "semantics_expression.h"

enum SemanticsSimulationStatementType
{
	SimStatConfiguration,
	SimStatRun,
	SimStatClear,
	SimStatReset
};

class SemanticsSimulationStatement
{
public:
	SemanticsSimulationStatement()
	{
		Type = NULL;
	}

	virtual ~SemanticsSimulationStatement()
	{

	}

	SemanticsSimulationStatementType * Type;

#ifdef DEBUG
	void DebugXMLOutput(FILE * fo);
#endif
};


class SemanticsSimStatConfiguration : SemanticsSimulationStatement
{
public:
	SemanticsSimStatConfiguration() : SemanticsSimulationStatement()
	{
		Name = new GenericTable<int>();
		Parameters = new GenericTable<SemanticsExpression>();
	}

	~SemanticsSimStatConfiguration()
	{

	}

	GenericTable<int> * Name;
	GenericTable<SemanticsExpression> * Parameters;

#ifdef DEBUG
	void DebugXMLOutput(FILE * fo);
#endif
};


class SemanticsSimStatRun : SemanticsSimulationStatement
{
public:
	SemanticsSimStatRun() : SemanticsSimulationStatement()
	{
		 Expression = NULL;
		 UptoExpression = NULL;
	}

	~SemanticsSimStatRun()
	{

	}

	SemanticsExpression * Expression;
	SemanticsExpression * UptoExpression;

#ifdef DEBUG
	void DebugXMLOutput(FILE * fo);
#endif
};



class SemanticsSimStatClear : SemanticsSimulationStatement
{
public:
	SemanticsSimStatClear() : SemanticsSimulationStatement()
	{
	}

	~SemanticsSimStatClear()
	{
	}

#ifdef DEBUG
	void DebugXMLOutput(FILE * fo);
#endif
};


class SemanticsSimStatReset : SemanticsSimulationStatement
{
public:
	SemanticsSimStatReset() : SemanticsSimulationStatement()
	{
	}

	~SemanticsSimStatReset()
	{
	}

#ifdef DEBUG
	void DebugXMLOutput(FILE * fo);
#endif
};

class SemanticsSimulation
{
public:
	SemanticsSimulation();
	~SemanticsSimulation();

	int CurrentContext;

	GenericTable<int> * Name;
	GenericTable<SemanticsSimulationStatement> * Body;

#ifdef DEBUG
	void DebugXMLOutput(FILE * fo);
#endif
};

#endif
